home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / bin / foo2hp2600-wrapper < prev    next >
Text File  |  2008-09-09  |  17KB  |  746 lines

  1. #!/bin/sh
  2.  
  3. #* Copyright (C) 2005-2006  Rick Richardson
  4. #*
  5. #* This program is free software; you can redistribute it and/or modify
  6. #* it under the terms of the GNU General Public License as published by
  7. #* the Free Software Foundation; either version 2 of the License, or
  8. #* (at your option) any later version.
  9. #*
  10. #* This program is distributed in the hope that it will be useful,
  11. #* but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. #* GNU General Public License for more details.
  14. #*
  15. #* You should have received a copy of the GNU General Public License
  16. #* along with this program; if not, write to the Free Software
  17. #* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. #*
  19. #* Authors: Rick Richardson <rick.richardson@comcast.net>
  20.  
  21. VERSION='$Id: foo2hp2600-wrapper.in,v 1.60 2007/12/27 06:52:45 rick Exp $'
  22.  
  23. #
  24. # Printer Notes:
  25. #
  26. # hp2600 -
  27. #
  28.  
  29. PROGNAME="$0"
  30. BASENAME=`basename $PROGNAME`
  31. PREFIX=/usr
  32. SHARE=$PREFIX/share/foo2hp
  33. PATH=$PATH:/sw/bin:/opt/local/bin
  34.  
  35. #
  36. #    Log the command line, for debugging and problem reports
  37. #
  38. if [ -x /usr/bin/logger ]; then
  39.     logger -t "$BASENAME" -p lpr.info -- "$BASENAME $@" </dev/null
  40. fi
  41.  
  42. usage() {
  43.     cat <<EOF
  44. Usage:
  45.     $BASENAME [options] [ps-file]
  46.  
  47.     Foomatic printer wrapper for the foo2hp2600 printer driver.
  48.     This script reads a Postscript ps-file or standard input
  49.     and converts it to Zenographics ZjStream printer format.
  50.  
  51. Normal Options:
  52. -b bits           Bits per plane (1 or 2) [$BPP]
  53. -c                Print in color (else monochrome)
  54. -d duplex         Duplex code to send to printer [$DUPLEX]
  55.                     1=off, 2=longedge, 3=shortedge
  56. -m media          Media code to send to printer [$MEDIA]
  57.                     1=standard, 2=transparency, 3=glossy, 257=envelope,
  58.                     259=letterhead, 261=thickstock, 262=postcard, 263=labels
  59. -p paper          Paper code [$PAPER]
  60.                     1=letter, 5=legal, 7=executive, 9=A4, 11=A5, 13=B5
  61.                     20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch
  62. -n copies         Number of copies [$COPIES]
  63. -r <xres>x<yres>  Set device resolution in pixels/inch [$RES]
  64. -s source         Source code to send to printer [$SOURCE]
  65.                     1=tray2, 2=tray3, 4=manual/tray1, 7=auto
  66.             Code numbers may vary with printer model.
  67. -t                Draft mode.  Every other pixel is white.
  68. -2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
  69.                   Print with N-up (requires psutils)
  70. -o orient         For N-up: -op is portrait, -ol is landscape, -os is seascape.
  71.  
  72. Printer Tweaking Options:
  73. -u <xoff>x<yoff>  Set offset of upper left printable in pixels [varies]
  74. -l <xoff>x<yoff>  Set offset of lower right printable in pixels [varies]
  75. -L mask           Send logical clipping values from -u/-l in ZjStream [3]
  76.                   0=no, 1=Y, 2=X, 3=XY
  77. -P                Do not output START_PLANE codes.  May be needed by some
  78.                   monochrome-only printers.
  79. -X padlen         Add extra zero padding to the end of BID segments [16]
  80.  
  81. Color Tweaking Options:
  82. -g gsopts         Additional options to pass to Ghostscript, such as
  83.                   -dDITHERPPI=nnn, etc.  May appear more than once. []
  84. -G profile.icm    Convert profile.icm to a Postscript CRD using icc2ps and
  85.                   adjust colors using the setcolorrendering PS operator.
  86.                   $SHARE/icm/ will be searched for profile.icm.
  87. -I intent         Select profile intent from ICM file [$INTENT]
  88.                   0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
  89. -G gamma-file.ps  Prepend gamma-file to the Postscript input to perform
  90.                   color correction using the setcolortransfer PS operator.
  91.  
  92. Debugging Options:
  93. -S plane          Output just a single color plane from a color print [all]
  94.                   1=Cyan, 2=Magenta, 3=Yellow, 4=Black
  95. -D lvl            Set Debug level [$DEBUG]
  96. -V                $VERSION
  97. EOF
  98.  
  99.     exit 1
  100. }
  101.  
  102. #
  103. #       Report an error and exit
  104. #
  105. error() {
  106.     echo "$BASENAME: $1" >&2
  107.     exit 1
  108. }
  109.  
  110. dbgcmd() {
  111.     if [ $DEBUG -ge 1 ]; then
  112.         echo "$@" >&2
  113.     fi
  114.     "$@"
  115. }
  116.  
  117. #
  118. # Portable version of 'which'
  119. #
  120. pathfind() {
  121.     if [ "$1" = -p ]; then
  122.     optp=1
  123.     shift
  124.     else
  125.     optp=0
  126.     fi
  127.     OLDIFS="$IFS"
  128.     IFS=:
  129.     for p in $PATH; do
  130.     if [ -x "$p/$*" ]; then
  131.         if [ $optp = 1 ]; then
  132.         echo "$p/$*"
  133.         fi
  134.         IFS="$OLDIFS"
  135.         return 0
  136.     fi
  137.     done
  138.     IFS="$OLDIFS"
  139.     return 1
  140. }
  141.  
  142. #
  143. # Returns true if $1 is 32-bit binary
  144. #
  145. is32() {
  146.     if pathfind file; then
  147.     path=`pathfind -p "$*"`
  148.     is32=`file -L "$path" | grep 32-bit` 
  149.     if [ "$is32" = "" ]; then
  150.         return 1
  151.     else
  152.         return 0
  153.     fi
  154.     else
  155.     return 1
  156.     fi
  157. }
  158.  
  159. #
  160. #    N-up-ify the job.  Requires psnup from psutils package
  161. #
  162. nup() {
  163.     case "$NUP" in
  164.     [2368]|1[0458])
  165.     tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
  166.     ;;
  167.     [49]|1[26])
  168.     tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
  169.     ;;
  170.     *)
  171.     error "Illegal call to nup()."
  172.     ;;
  173.     esac
  174. }
  175.  
  176. #
  177. #       Process the options
  178. #
  179.  
  180. # Try to use a local copy of GhostScript 8.54, if available.  Otherwise,
  181. # fallback to whatever the Linux distro has installed (usually 7.07)
  182. #
  183. # N.B. := operator used here, when :- would be better, because "ash"
  184. # doesn't have :-
  185. if gs.foo -v >/dev/null 2>&1; then
  186.         GSBIN=${GSBIN:-gs.foo}
  187. else
  188.         GSBIN=${GSBIN:-gs}
  189. fi
  190.  
  191. CMDLINE="$*"
  192. DEBUG=0
  193. DUPLEX=1
  194. BPP=1
  195. COLOR=
  196. COLORMODE=default
  197. QUALITY=1
  198. QUALITY=wts
  199.  
  200. MEDIA=1
  201. COPIES=1
  202. test -r /etc/papersize && PAPER=$(cat /etc/papersize)
  203. test "$PAPER" || PAPER=1
  204. RES=600x600
  205. SOURCE=7
  206. NUP=
  207. CLIP_UL=
  208. CLIP_LR=
  209. CLIP_LOG=
  210. BC=
  211. AIB=
  212. NOPLANES=
  213. COLOR2MONO=
  214. GAMMAFILE=default
  215. INTENT=0
  216. GSOPTS=
  217. EXTRAPAD=
  218. SAVETONER=
  219. NUP_ORIENT=
  220. GSDEV=-sDEVICE=pbmraw
  221. SEGFAULT=0
  222. # What mode to use if the user wants us to pick the "best" mode
  223. case `$GSBIN --version` in
  224. 7*)
  225.     DEFAULTCOLORMODE=10
  226.     ;;
  227. 8.1*)
  228.     # Buggy 8.14/8.15 in Ubuntu
  229.     DEFAULTCOLORMODE=10
  230.     if is32 $GSBIN; then
  231.         GAMMAFILE=km2430_2.icm
  232.     else
  233.         GAMMAFILE=hpclj2600n-0.icm
  234.     SEGFAULT=1
  235.     fi
  236.     QUALITY=1
  237.     ;;
  238. *)
  239.     DEFAULTCOLORMODE=10
  240.     ;;
  241. esac
  242.  
  243. while getopts "1:23456789o:b:cC:d:g:l:u:L:m:n:p:q:r:s:tABS:D:G:I:PX:Vh?" opt
  244. do
  245.     case $opt in
  246.     b)    BPP="$OPTARG";;
  247.     c)    COLOR=-c;;
  248.     d)    DUPLEX="$OPTARG";;
  249.     g)    GSOPTS="$GSOPTS $OPTARG";;
  250.     m)    MEDIA="$OPTARG";;
  251.     n)    COPIES="$OPTARG";;
  252.     p)    PAPER="$OPTARG";;
  253.     q)    QUALITY="$OPTARG";;
  254.     r)    RES="$OPTARG";;
  255.     s)    SOURCE="$OPTARG";;
  256.     t)    SAVETONER="-t";;
  257.     l)    CLIP_LR="-l $OPTARG";;
  258.     u)    CLIP_UL="-u $OPTARG";;
  259.     L)    CLIP_LOG="-L $OPTARG";;
  260.     A)    AIB=-A;;
  261.     B)    BC=-B;;
  262.     C)    COLORMODE="$OPTARG";;
  263.     S)    COLOR2MONO="-S$OPTARG";;
  264.     D)    DEBUG="$OPTARG";;
  265.     G)    GAMMAFILE="$OPTARG";;
  266.     I)    INTENT="$OPTARG";;
  267.     P)    NOPLANES=-P;;
  268.     X)    EXTRAPAD="-X $OPTARG";;
  269.     [234689])    NUP="$opt";;
  270.     [57])    error "Can't find acceptable layout for $opt-up";;
  271.     1)    case "$OPTARG" in
  272.         [024568])    NUP="1$OPTARG";;
  273.         *)    error "Can't find acceptable layout for 1$OPTARG-up";;
  274.         esac
  275.         ;;
  276.     o)    case "$OPTARG" in
  277.         l*)    NUP_ORIENT=-l;;
  278.         s*)    NUP_ORIENT=-r;;
  279.         p*|*)    NUP_ORIENT=;;
  280.         esac;;
  281.     V)    echo "$VERSION"; foo2hp -V; foo2zjs-pstops -V; exit 0;;
  282.     h|\?)
  283.         if [ "$CMDLINE" != "-?" -a "$CMDLINE" != -h ]; then
  284.             echo "Illegal command:"
  285.             echo "    $0 $CMDLINE"
  286.             echo
  287.         fi
  288.         usage;;
  289.     esac
  290. done
  291. shift `expr $OPTIND - 1`
  292.  
  293. #
  294. # If there is an argument left, take it as the file to print.
  295. # Else, the input comes from stdin.
  296. #
  297. if [ $# -ge 1 ]; then
  298.     if [ "$LPJOB" = "" ]; then
  299.     : # LPJOB="$1"
  300.     fi
  301.     exec < $1
  302. fi
  303.  
  304.  
  305. #
  306. #    Select the ghostscript device to use
  307. #
  308. case "$BPP" in
  309. 1)    if [ "" = "$COLOR" ]; then
  310.         GSDEV=-sDEVICE=pbmraw
  311.     else
  312.         GSDEV=-sDEVICE=bitcmyk
  313.     fi
  314.     case "$GAMMAFILE" in
  315.     default)
  316.         if [ $SEGFAULT = 0 ]; then
  317.         GAMMAFILE=hpclj2600n-1.icm
  318.         else
  319.         GAMMAFILE=hpclj2600n-0.icm
  320.         fi
  321.         ;;
  322.     none) GAMMAFILE=;;
  323.     esac
  324.     ;;
  325. 2)    if [ "" = "$COLOR" ];
  326.     then
  327.         # GSDEV=-sDEVICE=pgmraw
  328.         # error "2-bpp monochrome is not yet supported"
  329.         GSDEV="-sDEVICE=cups -dcupsColorSpace=3 -dcupsBitsPerColor=2"
  330.         GSDEV="$GSDEV -dcupsColorOrder=2"
  331.     else
  332.         GSDEV="-sDEVICE=cups -dcupsColorSpace=6 -dcupsBitsPerColor=2"
  333.         GSDEV="$GSDEV -dcupsColorOrder=2"
  334.     fi
  335.     if [ $GSBIN = "gs.foo" ]; then
  336.         GSBIN=gs
  337.     fi
  338.  
  339.     case "$GAMMAFILE" in
  340.     default) 
  341.         if is32 $GSBIN; then
  342.         GAMMAFILE=km2430_2.icm
  343.         GAMMAFILE=hpclj2600n-1.icm
  344.         else
  345.         GAMMAFILE=
  346.         fi
  347.         ;;
  348.     none) GAMMAFILE=;;
  349.     esac
  350.     ;;
  351. *)    error "Illegal number of bits per plane ($BPP)";;
  352. esac
  353.  
  354. #
  355. case "$QUALITY" in
  356. 0)
  357.     GSOPTS="-dCOLORSCREEN $GSOPTS"
  358.     ;;
  359. 1)
  360.     GSOPTS="-dCOLORSCREEN $GSOPTS"
  361.     ;;
  362. 2)
  363.     GSOPTS="-dMaxBitmap=500000000 $GSOPTS"
  364.     ;;
  365. wts)
  366.     GSOPTS="-dCOLORSCREEN -dMaxBitmap=500000000 $GSOPTS"
  367.     ;;
  368. esac
  369.  
  370. #
  371. #    Validate media code
  372. #
  373. case "$MEDIA" in
  374. 1|plain)    MEDIA=1;;
  375. 514|preprinted)    MEDIA=514;;
  376. 513|letterhead)    MEDIA=513;;
  377. 2|transparency)    MEDIA=2;;
  378. 515|prepunched)    MEDIA=515;;
  379. 265|labels)    MEDIA=265;;
  380. 260|bond)    MEDIA=260;;
  381. 516|recycled)    MEDIA=516;;
  382. 512|color)    MEDIA=512;;
  383. 276|tough)    MEDIA=276;;
  384. 267|envelope)    MEDIA=267;;
  385. 258|light)    MEDIA=258;;
  386. 262|heavy)    MEDIA=262;;
  387. 261|cardstock)    MEDIA=261;;
  388. 268|lightglossy)    MEDIA=268;;
  389. 269|glossy)    MEDIA=269;;
  390. 270|heavyglossy)    MEDIA=270;;
  391. 277|cover)    MEDIA=277;;
  392. 278|photo)    MEDIA=278;;
  393. [0-9]*)        ;;
  394. *)        error "Unknown media code $MEDIA";;
  395. esac
  396.  
  397. #
  398. #    Validate source (InputSlot) code
  399. #
  400. case "$SOURCE" in
  401. 1|tray2)    SOURCE=1;;
  402. 4|tray1)    SOURCE=4;;
  403. 7|auto)        SOURCE=7;;
  404. [0-9]*)        ;;
  405. *)        error "Unknown source code $SOURCE";;
  406. esac
  407.  
  408. #
  409. #    Validate Duplex code
  410. #
  411. case "$DUPLEX" in
  412. 1|off|none)    DUPLEX=1;;
  413. 2|long*)    DUPLEX=2;;
  414. 3|short*)    DUPLEX=3;;
  415. [0-9]*)        ;;
  416. *)        error "Unknown duplex code $DUPLEX";;
  417. esac
  418.  
  419. #
  420. #    Validate Resolution
  421. #
  422. case "$RES" in
  423. 600x600)    ;;
  424. 1200x600)    ;;
  425. 2400x600)    ;;
  426. *)        error "Illegal resolution $RES";;
  427. esac
  428.  
  429. #
  430. #    Figure out the paper dimensions in pixels/inch, and set the
  431. #    default clipping region.  Unfortunately, this is a trouble
  432. #    area for ZjStream printers.  Various versions of ZjS print
  433. #    engines react differently when asked to print into their
  434. #    unprintable regions.
  435. #
  436. set_clipping() {
  437.     ulx=$1; uly=$2
  438.     lrx=$3; lry=$4
  439.  
  440.     # Set clipping region if it isn't already set
  441.     if [ "$CLIP_UL" = "" ]; then
  442.     case "$RES" in
  443.     600x600)    ulx=`expr $ulx / 2`;;
  444.     2400x600)    ulx=`expr $ulx \* 2`;;
  445.     esac
  446.     CLIP_UL="-u ${ulx}x${uly}"
  447.     fi
  448.     if [ "$CLIP_LR" = "" ]; then
  449.     case "$RES" in
  450.     600x600)    lrx=`expr $lrx / 2`;;
  451.     2400x600)    lrx=`expr $lrx \* 2`;;
  452.     esac
  453.     CLIP_LR="-l ${lrx}x${lry}"
  454.     fi
  455. }
  456.  
  457. case "$PAPER" in
  458. Custom*)
  459.         #%%BeginFeature: *CustomPageSize True
  460.         #216
  461.         #360
  462.         #0
  463.         #0
  464.         #0
  465.         #pop pop pop pop pop
  466.  
  467.         #%%BeginFeature: *CustomPageSize True
  468.         #792.000000 612.000000 1 0.000000 0.000000
  469.         #pop pop pop pop pop
  470.  
  471.         if [ $DEBUG = 0 ]; then
  472.             TMPFILE=/tmp/cus$$
  473.         else
  474.             TMPFILE=/tmp/custom.ps
  475.         fi
  476.         cat >$TMPFILE
  477.         exec <$TMPFILE
  478.  
  479.         tmp=`head -n 10000 $TMPFILE \
  480.             | sed -n '/CustomPageSize/{n;p;n;p;}' \
  481.             | tr '\n' ' '`
  482.         case "$tmp" in
  483.         [0-9]*\ [0-9]*)
  484.             XDIM=`echo "$tmp" | sed 's/ .*//'`
  485.             YDIM=`echo "$tmp" | sed -e 's/^[^ ]* //' -e 's/ .*//'`
  486.             ;;
  487.         *)
  488.             if [ $DEBUG = 0 ]; then rm -f $TMPFILE; fi
  489.             error "Custom page size [XY]DIM != 1-99999"
  490.             ;;
  491.         esac
  492.         XDIM=`dc -e "$XDIM 1200* 72/p"`
  493.         YDIM=`dc -e "$YDIM 600* 72/p"`
  494.         PAPER=1;        paper=letter;
  495.                 set_clipping 2 80     2 80
  496.         ;;
  497. 1|letter)    PAPER=1;    paper=letter;    XDIM="10200"; YDIM="6600"
  498.         set_clipping 172 80    172 80
  499.         ;;
  500. 5|legal)    PAPER=5;    paper=legal;     XDIM="10200"; YDIM="8400"
  501.         set_clipping 172 80    172 80
  502.         ;;
  503. 7|executive)    PAPER=7;    paper=executive; XDIM="8700";  YDIM="6300"
  504.         set_clipping 174 78    174 78
  505.         ;;
  506. 9|a4|A4)    PAPER=9;    paper=a4;        XDIM="9920";  YDIM="7016"
  507.         set_clipping 176 84    176 84
  508.         ;;
  509. 11|a5|A5)    PAPER=11;    paper=a5;        XDIM="6992";  YDIM="4960"
  510.         set_clipping 176 80    176 80
  511.         ;;
  512. 13|b5|B5|b5jis)    PAPER=13;    paper=b5;        XDIM="8598";  YDIM="6070"
  513.         set_clipping 172 83    171 83
  514.         ;;
  515. 20|"env#10")    PAPER=20;    paper=env10;     XDIM="4950";  YDIM="5700"
  516.         set_clipping 171 78    171 78
  517.         ;;
  518. 27|envDL)    PAPER=27;    paper=envDL;     XDIM="5200";  YDIM="5200"
  519.         set_clipping 176 84    176 84
  520.         ;;
  521. 28|envC5)    PAPER=28;    paper=envC5;     XDIM="7650";  YDIM="5408"
  522.         set_clipping 170 80    169 80
  523.         ;;
  524. 34|envB5)    PAPER=34;    paper=envB5;     XDIM="8316";  YDIM="5892"
  525.         set_clipping 174 74    174 74
  526.         ;;
  527. 37|envMonarch)    PAPER=37;    paper=envMonarch;XDIM="4650";  YDIM="4500"
  528.         set_clipping 174 78    173 78
  529.         ;;
  530. *)        error "Unimplemented paper code $PAPER";;
  531. esac
  532. # e.g. /usr/share/ghostscript/7.07/lib/gs_statd.ps
  533. PAPERSIZE="-sPAPERSIZE=$paper";
  534.  
  535. case "$RES" in
  536. 600x600)    XDIM=`expr $XDIM / 2`;;
  537. 1200x600)    ;;
  538. 2400x600)    XDIM=`expr $XDIM \* 2`;;
  539. esac
  540. DIM="${XDIM}x${YDIM}"
  541.  
  542. #
  543. # Filter thru psnup if N-up printing has been requested
  544. #
  545. case $NUP in
  546. [234689]|1[024568])    PREFILTER="nup";;
  547. *)            PREFILTER=cat;;
  548. esac
  549. if [ "$DEBUG" -ge 9 ]; then
  550.     PREFILTER="tee /tmp/$BASENAME.ps"
  551. fi
  552.  
  553. #
  554. #    Overload -G.  If the file name ends with ".icm" or ".ICM"
  555. #    then convert the ICC color profile to a Postscript CRD,
  556. #    then prepend it to the users job.  Select the intent
  557. #    using the -I option.
  558. #
  559.  
  560. create_crd() {
  561.     #
  562.     # Create a Postscript CRD
  563.     #
  564.     ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
  565.     if [ -x $ICC2PS ]; then
  566.     case "$GAMMAFILE" in
  567.     none.icm | */none.icm)
  568.         ;;
  569.     *)
  570.         $ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
  571.         || error "Problem converting .ICM file to Postscript"
  572.         ;;
  573.     esac
  574.  
  575.     PSTOPS_OPTS="$PSTOPS_OPTS -c"
  576.     cat > $ICCTMP.usecie.ps <<-EOF
  577.         %!PS-Adobe-3.0
  578.         <</UseCIEColor true>>setpagedevice
  579.     EOF
  580.     if [ "$QUALITY" = wts ]; then
  581.         cat >> $ICCTMP.usecie.ps <<-EOF
  582.         << /UseWTS true >> setuserparams
  583.         <<
  584.             /AccurateScreens true
  585.             /HalftoneType 1
  586.             /HalftoneName (Round Dot Screen) cvn
  587.             /SpotFunction { 180 mul cos exch 180 mul cos add 2 div}
  588.             /Frequency 137
  589.             /Angle 37
  590.         >> sethalftone
  591.         EOF
  592.     fi
  593.     cat > $ICCTMP.selcrd.ps <<-EOF
  594.         /Current /ColorRendering findresource setcolorrendering
  595.     EOF
  596.     case "$GAMMAFILE" in
  597.     none.icm | */none.icm) GAMMAFILE="$ICCTMP.usecie.ps";;
  598.     *)    GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps";;
  599.     esac
  600.     else
  601.     GAMMFILE=
  602.     fi
  603. }
  604.  
  605. if [ $DEBUG -gt 0 ]; then
  606.     ICCTMP=/tmp/icc
  607. else
  608.     ICCTMP=/tmp/icc$$
  609. fi
  610.  
  611. if [ "" = "$COLOR" ]; then
  612.     COLORMODE=
  613.     GAMMAFILE=
  614. else
  615.     case "$COLORMODE" in
  616.     default)    COLORMODE=$DEFAULTCOLORMODE;;
  617.     esac
  618. fi
  619.  
  620. CRDBASE="$PREFIX/share/foo2zjs/crd"
  621. PSFILES="$PREFIX/share/foo2hp/psfiles"
  622. case "$RES" in
  623.     600x600)    SCREEN=screen1200.ps;;
  624.     1200x600)    SCREEN=screen1200.ps;;
  625.     2400x600)    SCREEN=screen2400.ps;;
  626. esac
  627.  
  628. PSTOPS_OPTS="-n"
  629.  
  630. case "$COLORMODE" in
  631. 0|"")
  632.     # Monochrome
  633.     ;;
  634. 10|icm)
  635.     # Use old ICM method
  636.     AIB=-A
  637.     BC=-B
  638.     case "$GAMMAFILE" in
  639.     none.icm | */none.icm)
  640.     create_crd
  641.     ;;
  642.     *.icm|*.ICM|*.icc|*.ICC)
  643.     #
  644.     # Its really an .ICM file, not a gamma file.
  645.     #
  646.     # The file can be a full path name, or the name of a file in $SHARE/icm/
  647.     #
  648.     if [ -r "$GAMMAFILE" ]; then
  649.         create_crd
  650.     elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
  651.         GAMMAFILE="$SHARE/icm/$GAMMAFILE"
  652.         create_crd
  653.     else
  654.         GAMMAFILE=
  655.     fi
  656.     ;;
  657.     esac
  658.     ;;
  659. *.crd)
  660.     GAMMAFILE="$CRDBASE/prolog.ps"
  661.     if [ -f $COLORMODE ]; then
  662.     GAMMAFILE="$GAMMAFILE $COLORMODE"
  663.     elif [ -f $CRDBASE/$COLORMODE ]; then
  664.     GAMMAFILE="$GAMMAFILE $CRDBASE/$COLORMODE"
  665.     else
  666.     error "Can't find CRD '$COLORMODE' in . or in $CRDBASE"
  667.     fi
  668.     GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
  669.     ;;
  670. *)
  671.     error "Unknown color method '$COLORMODE'"
  672.     ;;
  673. esac
  674.  
  675. if [ "$COLOR" != "" -a "$QUALITY" = wts ]; then
  676.     PSTOPS_OPTS="$PSTOPS_OPTS -w"
  677. fi
  678.  
  679. if [ "" != "$COLOR" ]; then
  680.     if [ "" = "$AIB" -a "" = "$BC" ]; then
  681.     # Faster, but can't handle AllIsBlack or BlackClears
  682.     : #GSDEV=-sDEVICE=pksmraw
  683.     else
  684.     # Can't handle different size pages
  685.     : #GSDEV=-sDEVICE=bitcmyk
  686.     fi
  687. fi
  688.  
  689. #
  690. #    Figure out USERNAME
  691. #
  692. if [ "$LPUSER" != "" ]; then
  693.     USER="$LPUSER@$LPHOST"
  694. else
  695.     USER=""
  696. fi
  697.  
  698. #
  699. #    Main Program, just cobble together the pipeline and run it
  700. #
  701. #    The malarky with file descriptors 1 and 3 is to avoid a bug in
  702. #    (some versions?) of Ghostscript where Postscript's stdout gets
  703. #    intermingled with the printer drivers output, resulting in
  704. #    corrupted image data.
  705. #
  706. #    CUPS also does grief by adding its own PS code to the input file.
  707. #    We take care of that with the sed command.  Thus, Well Tempered
  708. #    Screening now works!
  709. #
  710. GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
  711.  
  712. foo2zjs-pstops $PSTOPS_OPTS | \
  713. $PREFILTER \
  714. | ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
  715.     -sOutputFile="|cat 1>&3" $GAMMAFILE -_ >/dev/null 2>&1) 3>&1 \
  716. | foo2hp -r$RES -g$DIM -p$PAPER -m$MEDIA -n$COPIES -d$DUPLEX -s$SOURCE \
  717.         $COLOR -b$BPP $CLIP_UL $CLIP_LR $CLIP_LOG $SAVETONER \
  718.         -J "$LPJOB" -U "$USER" \
  719.         $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD -D$DEBUG
  720.  
  721. #
  722. #    Log the command line, for debugging and problem reports
  723. #
  724. if [ -x /usr/bin/logger ]; then
  725.     logger -t "$BASENAME" -p lpr.info -- \
  726.     "$GSBIN $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS $GAMMAFILE"
  727.     logger -t "$BASENAME" -p lpr.info -- \
  728.     "foo2hp -r$RES -g$DIM -p$PAPER -m$MEDIA \
  729. -n$COPIES -d$DUPLEX -s$SOURCE $COLOR -b$BPP $CLIP_UL $CLIP_LR $CLIP_LOG \
  730. $SAVETONER $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD"
  731. fi
  732.  
  733. #
  734. #    Remove cruft
  735. #
  736. if [ $DEBUG -eq 0 ]; then
  737.     for i in crd.ps log usecie.ps selcrd.ps
  738.     do
  739.     file="$ICCTMP.$i"
  740.     [ -f $file ] && rm -f $file
  741.     done
  742.     [ -f "$TMPFILE" ] && rm -f $TMPFILE
  743. fi
  744.  
  745. exit 0
  746.